package ar.org.cfired.creditos.servlets;

import javax.servlet.*;
import javax.servlet.http.*;

import java.io.*;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.servlet.*;
import org.apache.commons.fileupload.disk.*;
import org.hibernate.Session;

import ar.org.cfired.hibernate.utils.HibernateUtil;
import ar.org.cfired.creditos.Adjunto;
import ar.org.cfired.creditos.gui.Sesion;

import ar.org.cfired.creditos.repositorios.*;

import java.util.Date;

public class Adjuntos extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void init() throws ServletException {
        // Initialization here...
    }

    public void service(HttpServletRequest req, HttpServletResponse res)
            throws ServletException {
        String salida = "";
        String usuario = "";
        PrintWriter out;
        Session session  = null;
       try{
    	   out = res.getWriter();   
       }
       catch (Exception e){
    	   throw new ServletException();    	   
       }
       
        
        try {


            HttpSession sessionH = req.getSession(true);
            if (sessionH.isNew()) {
                //sessionH.setAttribute("Sesion", new Sesion());
                //mostrar que hubo un error
                salida = "<html><body>";
                salida += "Sesi&oacute;n no iniciada 1.";
                salida += "</body></html>";
                //out = res.getWriter();
                out.print(salida);
                return;
            } else {
                if (((Sesion) sessionH.getAttribute("Sesion")).getRegistrado()) {
                    usuario = (String) sessionH.getAttribute("usuario");
                } else {
                    salida = "<html><body>";
                    salida += "Sesi&oacute;n no iniciada 2.";
                    salida += "</body></html>";
                     //out = res.getWriter();
                    out.print(salida);
                    return;
                }
            }



            boolean isMultipart = ServletFileUpload.isMultipartContent(req);
            if (isMultipart) {
                // Create a factory for disk-based file items
                FileItemFactory factory = new DiskFileItemFactory();

                // Create a new file upload handler
                ServletFileUpload upload = new ServletFileUpload(factory);

                // Parse the request
                List<FileItem> items = upload.parseRequest(req);

                Iterator<FileItem> iter = items.iterator();
                String name;
                String value;
                String fieldName;
                String fileName;
                String contentType;
                boolean isInMemory;
                long sizeInBytes;
                String cre_id = null;

                String desc = null;

                FileItem itemArchivo = null;
                while (iter.hasNext()) {
                    FileItem item = (FileItem) iter.next();

                    if (item.isFormField()) {
                        name = item.getFieldName();
                        value = item.getString();
                        if (name.equals("cre_id")) {
                            cre_id = value;
                        }
                        /*if (name.equals("usuario")) {
                        usuario = value;
                        }*/
                        if (name.equals("descripcion")) {
                            desc = value;
                        }

                    } else {
                        itemArchivo = item;
                    }
                }


                

                fieldName = itemArchivo.getFieldName();
                fileName = itemArchivo.getName();
                contentType = itemArchivo.getContentType();
                isInMemory = itemArchivo.isInMemory();
                sizeInBytes = itemArchivo.getSize();
                //File fullFile = new File(itemArchivo.getName());
                
                //File savedFile = new File(System.getProperty("jboss.server.home.dir") + "/adjuntos/" + cre_id + "/", fullFile.getName());
           //     File savedFile = new File(System.getProperty("catalina.base") + "/adjuntos/" + cre_id + "/", fullFile.getName());

           //     savedFile.getParentFile().mkdirs();

                //getServletContext().getRealPath("/"),
           //     itemArchivo.write(savedFile);

                
                
                // Guardo en la base
                session = HibernateUtil.getSessionFactory().getCurrentSession();
                session.beginTransaction();

                Adjunto adj = new Adjunto();
                adj.setAdjDescripcion(desc);
                adj.setAdjUsuario(usuario);
                adj.setAdjRuta(itemArchivo.getName());//savedFile.getAbsolutePath());
                adj.setAdjFecha(new Date());
                adj.setCreId(Integer.valueOf(cre_id));
                session.save(adj);
                session.getTransaction().commit();
                if (session.isOpen()) 
                	session.close();
                
                //Guardo en el repositorio
                Archivo archivoRepo = new Archivo();
                archivoRepo.setExecutionID(new Integer(cre_id));
                archivoRepo.setProceso("creditos");
                archivoRepo.setNombreArchivo(String.valueOf(adj.getAdjId()));//  getAbsolutePath());
                archivoRepo.setArchivo(itemArchivo.getInputStream());
                archivoRepo.guardar();
                
                
                salida = "<html><body onload=\"window.opener.cargarAdjuntos("+ cre_id + ");\">";
                //salida += fieldName + "|" + fileName + "|" + contentType + "|" + isInMemory + "|" + sizeInBytes + "<br>";
                salida += "Archivo guardado. Click <a href=\"\" onClick=\"window.close();\">aqu&iacute;</a> para cerrar.";
                salida += "</body></html>";


            } else {
                salida = "No es multipart!!!";
            }
            res.setContentType("text/html; charset=iso-8859-1");
            //out = res.getWriter();

            out.print(salida);
        } /*catch (IOException ioe) {
            throw new ServletException(ioe);
        } catch (FileUploadException fue) {
            throw new ServletException(fue);
        } catch (Exception e) {
            throw new ServletException(e);
        }*/
        catch( Exception e )
		{
			 //System.out.println("*******Tirando Exception");
			 //throw new ServletException( e );

			 if (session!=null)
				 if (session.isOpen()) 
					 session.close();

        	
        	 CreditosServletWebException e2 = new CreditosServletWebException(e, "al cargar los adjuntos");
			 out.print(e2.getMessage());
			 e.printStackTrace();
			 
			 
		}
    }

    public void destroy() {
        // Cleanup here...
    }
}
